package org.sang.service.impl;

import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.google.common.collect.Lists;
import com.google.gson.Gson;
import com.mysql.cj.core.util.StringUtils;
import org.sang.bean.ConsumeItemConfig;
import org.sang.bean.ConsumeItemConfigExample;
import org.sang.common.SnowflakeIdGeneratorUtils;
import org.sang.common.UserUtils;
import org.sang.dto.ConsumeTypeRepDto;
import org.sang.exception.ConsumeException;
import org.sang.mapper.ext.ConsumeItemConfigExtMapper;
import org.sang.service.IConsumeItemConfigService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;

import java.util.Date;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
import java.util.stream.Collectors;

/**
 * 〈一句话描述〉
 * 〈功能详细描述〉
 *
 * @author Naughty
 * @version 2018/4/4
 * @see ConsumeItemConfigServiceImpl
 * @since 1.0
 */

@Service
@Transactional
public class ConsumeItemConfigServiceImpl implements IConsumeItemConfigService {

    private static final Logger logger = LoggerFactory.getLogger(ConsumeItemConfigServiceImpl.class);
    @Autowired
    private ConsumeItemConfigExtMapper consumeItemConfigExtMapper;


    private static Gson gson = new Gson();

    /**
     * 新增.
     *
     * @param consumeItemConfig
     * @return
     */
    @Override
    public ConsumeItemConfig insertConsumeItemConfig(ConsumeItemConfig consumeItemConfig) {

            //查询一下这个门店的项目是否已经存在了，无论是生效还是失效
            ConsumeItemConfigExample consumeItemConfigExample = new ConsumeItemConfigExample();
            consumeItemConfigExample.createCriteria()
                .andItemTypeEqualTo(consumeItemConfig.getItemType())
                .andItemNameEqualTo(consumeItemConfig.getItemName())
                .andStoreIdEqualTo(consumeItemConfig.getStoreId());
            List<ConsumeItemConfig> list = consumeItemConfigExtMapper.selectByExample(consumeItemConfigExample);
            if (!CollectionUtils.isEmpty(list)) {
                logger.error("新建消费项目存在,请求参数{}", gson.toJson(consumeItemConfig));
                throw new ConsumeException("新增项目已经存在");
            }
        try {
            String itemId = String.valueOf(SnowflakeIdGeneratorUtils.getId());
            consumeItemConfig.setItemId(itemId);
            consumeItemConfig.setCreatedOperator(UserUtils.getCurrentUser().getUsername());
            consumeItemConfig.setCreatedTime(new Date());
            consumeItemConfig.setUpdateOperator(UserUtils.getCurrentUser().getUsername());
            consumeItemConfig.setUpdateTime(new Date());
            consumeItemConfigExtMapper.insert(consumeItemConfig);
            logger.info("新增消费配置{},成功",gson.toJson(consumeItemConfig));
        } catch (Exception e) {
            logger.error("新增消费配置,异常{}", e.getMessage());
            e.printStackTrace();
            throw new ConsumeException("新增异常");
        }
        return consumeItemConfig;

    }

    @Override
    public List<ConsumeTypeRepDto> findConsumeItemConfigByStoreId(String storeId) {

        ConsumeItemConfigExample consumeItemConfigExample = new ConsumeItemConfigExample();
        consumeItemConfigExample.createCriteria().andStoreIdEqualTo(storeId).andStatusEqualTo("1");
        List<ConsumeItemConfig> list = consumeItemConfigExtMapper.selectByExample(consumeItemConfigExample);
        logger.info("获取门店:{},有效消费配置项目{}条",storeId,list.size());
        if (CollectionUtils.isEmpty(list)) {
            return Lists.newArrayList();
        } else {
            return Optional.ofNullable(list)
                .orElse(Lists.newArrayList())
                .stream()
                .filter(Objects::nonNull)
                .map(s -> {
                    ConsumeTypeRepDto consumeTypeRepDto = new ConsumeTypeRepDto();
                    consumeTypeRepDto.setLabel(s.getItemName());
                    consumeTypeRepDto.setValue(s.getItemId());
                    consumeTypeRepDto.setType(s.getItemType());
                    consumeTypeRepDto.setPrice(s.getItemMoney());
                    return consumeTypeRepDto;
                })
                .collect(Collectors.toList());
        }
    }

    /**
     * 修改.
     *
     * @param consumeItemConfig
     * @return
     */
    @Override
    public ConsumeItemConfig updateConsumeItemConfig(ConsumeItemConfig consumeItemConfig) {
        try {
            consumeItemConfig.setUpdateTime(new Date());
            consumeItemConfig.setUpdateOperator(UserUtils.getCurrentUser().getUsername());
            consumeItemConfigExtMapper.updateConsumeItemConfigByItemId(consumeItemConfig);
            logger.info("消费配置{},修改信息", consumeItemConfig.getItemId());
        } catch (Exception e) {
            logger.error("修改消费配置,异常{}", e.getMessage());
            e.printStackTrace();
            throw new ConsumeException("修改异常");
        }
        return consumeItemConfig;
    }

    /**
     * 删除.
     */
    @Override
    public void deleteConsumeItemConfig(String itemId) {
        try {
            ConsumeItemConfigExample consumeItemConfigExample = new ConsumeItemConfigExample();
            consumeItemConfigExample.createCriteria().andItemIdEqualTo(itemId);
            consumeItemConfigExtMapper.deleteByExample(consumeItemConfigExample);
            logger.info("消费配置{},删除", itemId);
        } catch (Exception e) {
            logger.error("删除消费配置,异常{}", e.getMessage());
            e.printStackTrace();
            throw new ConsumeException("删除异常");
        }
    }

    /**
     * 查找单个.
     */
    @Override
    public ConsumeItemConfig queryConsumeItemConfig(String itemId) {
        logger.info("项目编号{},获取消费配置信息", itemId);
        ConsumeItemConfigExample consumeItemConfigExample = new ConsumeItemConfigExample();
        consumeItemConfigExample.createCriteria().andItemIdEqualTo(itemId);
        List<ConsumeItemConfig> list = consumeItemConfigExtMapper.selectByExample(consumeItemConfigExample);
        if (CollectionUtils.isEmpty(list)) {
            return null;
        } else {
            return list.get(0);
        }

    }

    /**
     * 按照门店编号查找列表.
     */
    @Override
    public Page<ConsumeItemConfig> queryConsumeItemConfigListByPage(int pageNum, int pageSize, ConsumeItemConfig
        consumeItemConfig) {

        Page<ConsumeItemConfig> result = PageHelper.startPage(pageNum, pageSize);
        ConsumeItemConfigExample consumeItemConfigExample = new ConsumeItemConfigExample();
        ConsumeItemConfigExample.Criteria criteria = consumeItemConfigExample.createCriteria();
        if (!StringUtils.isNullOrEmpty(consumeItemConfig.getItemId())) {
            criteria.andItemIdEqualTo(consumeItemConfig.getItemId());
        }
        if (!StringUtils.isNullOrEmpty(consumeItemConfig.getStoreId())) {
            criteria.andStoreIdEqualTo(consumeItemConfig.getStoreId());
        }
        if (!StringUtils.isNullOrEmpty(consumeItemConfig.getStatus())) {
            criteria.andStatusEqualTo(consumeItemConfig.getStatus());
        }
        if(!StringUtils.isNullOrEmpty(consumeItemConfig.getItemName())){
            criteria.andItemNameLike(consumeItemConfig.getItemName());
        }
        consumeItemConfigExtMapper.selectByExample(consumeItemConfigExample);

        return result;
    }


}
